﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Ubicaciones;
using Onshi.POS.Ubicaciones.Vistas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Onshi.POS.Formularios
{
    public partial class Barrios : FormularioBase, IBarrios
    {
        #region Constructores

        public Barrios(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new BarriosPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private BarriosPresentador presentador;
        private Int32 idBarrio;
        private enum MetodoHilo { Inicializar, Actualizar, Aceptar, Eliminar };

        #endregion

        #region Propiedades

        public Int32 IdBarrioSeleccionado
        {
            get { return idBarrio; }
        }

        [Browsable(false)]
        public String Observaciones
        {
            get { return txtObservaciones.Text; }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public Int32 IdBarrio
        {
            get { return idBarrio; }
        }

        [Browsable(false)]
        public Int32 IdLocalidadFiltro
        {
            get { return ucLocalidadFiltro.IdLocalidadSeleccionado; }
        }

        [Browsable(false)]
        public Int32 IdLocalidad
        {
            get { return ucLocalidad.IdLocalidadSeleccionado; }
        }

        [Browsable(false)]
        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public List<Barrio> ListadoBarrios
        {
            set { bsBarrios.DataSource = new SortableList<Barrio>(value); }
        }

        #endregion

        #region Metodos

        private void ActualizarCampos()
        {
            if (bsBarrios.Current != null)
            {
                idBarrio = ((Barrio)bsBarrios.Current).Id;
                txtNombre.Text = ((Barrio)bsBarrios.Current).Nombre;
                ucLocalidad.IdLocalidadSeleccionado = ((Barrio)bsBarrios.Current).Localidad.Id;
                ucLocalidad.Actualizar();
                txtObservaciones.Text = ((Barrio)bsBarrios.Current).Observaciones;
            }
            else
                LimpiarCampos();
        }

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtNombreFiltro.Text = String.Empty;
            ucLocalidadFiltro.IdLocalidadSeleccionado = (Int32)EnumLocalidades.Todos;
            ucLocalidadFiltro.Actualizar();
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            inicializando = false;
        }

        private void LimpiarCampos()
        {
            errBarrios.Clear();
            idBarrio = 0;
            txtNombre.Text = String.Empty;
            ucLocalidad.IdLocalidadSeleccionado = (Int32)EnumLocalidades.Todos;
            ucLocalidad.Actualizar();
            txtObservaciones.Text = String.Empty;
        }

        private void HabilitarControles(Boolean habilitar)
        {
            txtNombre.Enabled = habilitar;
            txtObservaciones.Enabled = habilitar;
            ucLocalidad.Enabled = habilitar;
            btnNuevo.Enabled = !habilitar;
            btnModificar.Enabled = !habilitar;
            btnEliminar.Enabled = !habilitar;
            btnAceptar.Enabled = habilitar;
            btnCancelar.Enabled = habilitar;
            navBarrios.Enabled = !habilitar;
            if (!habilitar)
                ValidarControles();
        }

        private void ValidarControles()
        {
            if (bsBarrios.Current != null)
            {
                btnSeleccionar.Enabled = true;
                if (((Barrio)bsBarrios.Current).Id == (Int32)EnumBarrios.NoEspecificado)
                {
                    btnModificar.Enabled = false;
                    btnEliminar.Enabled = false;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                }
            }
            else
            {
                idBarrio = 0;
                btnSeleccionar.Enabled = false;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
            }
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        #endregion

        private void Barrios_Load(Object sender, EventArgs e)
        {
            solBarrios.SelectedTab = tabDetalle;
            solBarrios.SelectedTab = tabListado;
            grdBarrios.ScrollBars = ScrollBars.None;
            bgwBarrios.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(true);
            ucLocalidad.IdLocalidadSeleccionado = (Int32)EnumLocalidades.NoEspecificada;
            ucLocalidad.Actualizar();
            txtNombre.Focus();
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("Los domicilios de que posean este barrio se actualizarán con el predeterminado" + Environment.NewLine + "¿Está seguro que desea eliminar el barrio?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwBarrios.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            var validado = true;
            errBarrios.Clear();
            if (String.IsNullOrWhiteSpace(txtNombre.Text))
            {
                validado = false;
                errBarrios.SetError(txtNombre, "El nombre no puede quedar vacío");
            }
            if (ucLocalidad.IdLocalidad == 0)
            {
                validado = false;
                errBarrios.SetError(ucLocalidad, "La localidad no puede quedar vacía");
            }
            if (validado)
            {
                bgwBarrios.RunWorkerAsync(MetodoHilo.Aceptar);
                procesando.ShowDialog();
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(false);
            ActualizarCampos();
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwBarrios.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idBarrio = ((Barrio)bsBarrios.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void solBarrios_Selecting(Object sender, TabControlCancelEventArgs e)
        {
            if (solBarrios.SelectedTab == tabDetalle)
                ActualizarCampos();
            else
                if (!navBarrios.Enabled)
                    e.Cancel = true;
        }

        private void bgwBarrios_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:
                        presentador.Inicializar();
                        cboObservacionesFiltro.Actualizar();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Aceptar:
                        presentador.Aceptar();
                        LimpiarCampos();
                        HabilitarControles(false);
                        ActualizarCampos();
                        solBarrios.SelectedTab = tabListado;
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        solBarrios.SelectedTab = tabListado;
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwBarrios_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actBarrios.Actualizar();
            grdBarrios.ScrollBars = ScrollBars.Both;
        }

        private void bsBarrios_PositionChanged(Object sender, EventArgs e)
        {
            if (solBarrios.SelectedTab == tabDetalle)
                ActualizarCampos();
        }

        private void grdBarrios_SelectionChanged(Object sender, EventArgs e)
        {
            ValidarControles();
        }

        private void grdBarrios_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsBarrios.Count > 0 && bsBarrios.Count == grdBarrios.RowCount)
                if (grdBarrios.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                    if (((Barrio)bsBarrios.List[e.RowIndex]).Observaciones != String.Empty)
                        e.Value = Properties.Resources.page_copy;
        }

        private void grdBarrios_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsBarrios.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    var barriosDetalle = new BarriosDetalle(((Barrio)bsBarrios.Current).Id);
                    barriosDetalle.ShowDialog();
                }
        }

        private void ucLocalidadFiltro_Seleccionado()
        {
            Filtrar();
        }

        #endregion
    }
}